﻿using Ext.Net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Security.Cryptography.X509Certificates;
using System.Configuration;
using EntGuayasSLA.BL.Archivos.Pdf;
using System.Text;
using EntGuayasSLA.BL;
using System.IO;
using EntGuayasSLA.BL.Licenciamiento;

namespace EGuayas.Web.Licenciamiento.dma
{
    public partial class wucFirma : ucWuc
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
        [DirectMethod(IDAlias = "wucDMFirma", ShowMask = true)]
        public void ShowDetailsFirma(string infoTable, string idArchivo, string Ruta)
        {
            try
            {

               this.ViewDetailsFirma(infoTable,idArchivo, Ruta);
               this.winFirma.Show();

            }
            catch (Exception ex)
            {
                RegistrarLog(ex);
            }


        }
        [DirectMethod(IDAlias = "wucDMFirma", ShowMask = true)]
        public void ViewDetailsFirma(string idTabla,string idArchivo, string Ruta)
        {

            try
            {
                this.hdWucFirma_TablaInfo.SetValue(idTabla);              
                this.hdWucFirma_DocViewId.SetValue(idArchivo);
                this.hdWucFirma_DocViewRuta.SetValue(Ruta);
                X509Certificate2 objCert = ReadCertificado(null);     
                //X509Certificate2 objCert = Certificate.GetX509Certificate2(ConfigurationManager.AppSettings.Get("PwdCer"), MapPath(string.Format("~/{0}", ConfigurationManager.AppSettings.Get("PathCer"))));
                if (objCert != null)
                {
                    var infoDetails = Certificate.ShowCertificateInfo(objCert, DateTime.Today);
                    txtDetailsFirma.Html = "<p>" + infoDetails.ToString() + "</p>";
                }
                else 
                {
                    this.btnFirmar.Hide();
                    X.Msg.Show(new MessageBoxConfig
                    {
                        Buttons = MessageBox.Button.OK,
                        Icon = MessageBox.Icon.INFO,
                        Title = "Mensaje",
                        Message = string.Format("{0}<br/>{1}", "Certificado no válido", "Certificado no existe, perimero debe subir certificado")
                    });
                
                
                }
            }
            catch (Exception ex)
            {
                RegistrarLog(ex);
            }


        }

        private X509Certificate2 ReadCertificado(string claveCer)
        {
            Persona objPersona = Persona.GetEditableRoot(Guid.Parse(GetSessionUsuario.PersonaId));
            string clave = Seguridad.DesEncriptar(objPersona.CertificadoClave);
            if (claveCer != null)
            {
                clave = claveCer;
            }
            string fileName = MapPath(string.Format("~/{0}{1}{2}", ConfigurationManager.AppSettings.Get("PathCer"), GetSessionUsuario.PersonaId, ConfigurationManager.AppSettings.Get("ExtCer")));
            X509Certificate2 objCert = null;
            try
            {
                    objCert = Certificate.GetX509Certificate2(clave, fileName);
            }
            catch 
            {
               
            }
            return objCert;
        }
        private static void FileDelete(string fileName)
        {


            try
            {
                if (File.Exists(fileName))
                {
                    File.Delete(fileName);
                }
            }
            catch (IOException e)
            {

                throw e;
            }




        }
        private static void RenameRemove(string sOutputFilename, string fileName)
        {

            try
            {

                FileDelete(fileName);
                if (!File.Exists(fileName))
                {
                    //
                    File.Move(sOutputFilename, fileName);
                    FileDelete(sOutputFilename);
                }
                else
                {
                    File.Copy(sOutputFilename, fileName);
                }
            }
            catch (Exception ex)
            {
                //RegistrarLog(ex);
            }
        }
        public void SetIfCallRefreshGridParent(Boolean val)
        {
            this.hdWucFirma.SetValue(val);
        }
        private  void CallRefreshGridParent()
        { 
          
            Boolean ifCallRefreshParent = Boolean.Parse(this.hdWucFirma.Text);
            if (ifCallRefreshParent==true)
                X.Js.AddScript("App.direct.pgDMFirma.RefreshGridParent({success: function (result) {},  eventMask: { showMask: true, minDelay: 500}});");
        }
        private static void UpdateEstadoInfome(Guid idInforme, string _estado, string _notifica)
        {
            Informe objInforme = Informe.GetEditableRoot(idInforme);
            objInforme.Estado = _estado;
            objInforme.Notifica = _notifica;
            objInforme.Save();

        }
        private static void UpdateInformeRevisionFase(Guid idArch, string estado, string nuevoInfId)
        {
            RevisionFase objRevFase = RevisionFase.GetEditableRoot(idArch);
            objRevFase.Aprobado = estado;
            objRevFase.Informe = nuevoInfId;
            objRevFase.Save();
        }
        protected void btnFirma_Click(object sender, DirectEventArgs e)
        {
            try
            {
                var id   = Guid.Parse(e.ExtraParams["hdDocViewId"]);
                var ruta = e.ExtraParams["hdDocViewRuta"];
                string clave = e.ExtraParams["clave"];//Clave de certificado:ConfigurationManager.AppSettings.Get("PwdCer")
                Boolean iFNoErrorFirma = false;
                Boolean ifRename     = false;
          
                StringBuilder infoString = new StringBuilder();
                Archivo objArch = Archivo.GetEditableRoot(id, e.ExtraParams["hdTablaInfo"]);
                var objCert = ReadCertificado(clave); //Certificate.GetX509Certificate2(clave, MapPath(string.Format("~/{0}", ConfigurationManager.AppSettings.Get("PathCer"))));
                
                if (objCert==null)
                {

                    this.txtClave.Text = "";
                    X.Msg.Show(new MessageBoxConfig
                    {
                        Buttons = MessageBox.Button.OK,
                        Icon = MessageBox.Icon.ERROR,
                        Title = "Error",
                        Message = string.Format("{0}<br/>{1}\n ", "Clave de certificado no válido", "Si dese firmar posteriormente documento seleciones opción <i>Firma electrónica</i> o ingrese clave correcta")
                    });

                }
                else
                {

                        if (Certificate.VerifyCertificateDate(objCert, out infoString))
                        {
                            if (objCert == null && objCert.HasPrivateKey)
                            {
                                winFirma.Close();
                                X.Msg.Show(new MessageBoxConfig
                                {
                                    Buttons = MessageBox.Button.OK,
                                    Icon = MessageBox.Icon.ERROR,
                                    Title = "Error",
                                    Message = "No posee certificado personal con clave privada"
                                });

                            }
                            else
                            {
                                string imgName = MapPath(string.Format("~/{0}", ConfigurationManager.AppSettings.Get("PathCerImg")));
                                string sSourceFilename = MapPath(ruta);
                                string sNewFilename = string.Format("{0}_f{1}", ruta.Substring(0, ruta.ToLower().IndexOf(".pdf")), ".pdf");
                                string sOutputFilename = MapPath(string.Format("{0}_{1}", ruta.Substring(0, ruta.ToLower().IndexOf(".pdf")), ".pdf"));
                                try
                                {
                                    ifRename = PdfSigner.SignPdfFile(sSourceFilename, Encoding.UTF8.GetBytes(ConfigurationManager.AppSettings.Get("PwdPdf")), sOutputFilename, objCert, "Test", "Loja", "Loja", imgName, "", "", "");
                                    iFNoErrorFirma = true;
                                }
                                catch(Exception ex)
                                {
                                    iFNoErrorFirma = false;
                                    RegistrarLog(ex);
                                }
                       
                                if (ifRename)
                                {
                                    byte[] USER = Encoding.UTF8.GetBytes(ConfigurationManager.AppSettings.Get("UserPdf"));//Encoding.UTF8.GetBytes(id.ToString())
                                    byte[] OWNER = Encoding.UTF8.GetBytes(ConfigurationManager.AppSettings.Get("PwdPdf"));//Encoding.UTF8.GetBytes(clave)
                                    Pdf.EncryptFilePdf(sOutputFilename, MapPath(sNewFilename), USER, OWNER);
                          

                                }
                                if (iFNoErrorFirma == true)
                                {
                                    objArch.RequiereFirmar = Valores.Codigo_CHAR_No;
                                    objArch.SubirNuevo = Valores.Codigo_CHAR_No;
                                    objArch.Save();
                                    Archivo objArchNewVer = Archivo.NewEditableRoot(e.ExtraParams["hdTablaInfo"]);
                                    objArchNewVer.Id = System.Guid.NewGuid();
                                    //Se cambia el objArch.Id por objArch.Referencia ya que ahi esta la referencia al original.
                                    objArchNewVer.Referencia = objArch.Referencia;
                                    objArchNewVer.TipoDocumento = objArch.TipoDocumento;
                                    objArchNewVer.Version = objArch.Version + 1;
                                    //Para recuperar el nombre original y colocarle la version.
                                    if (objArch.Nombre.LastIndexOf("V") > 0)
                                        objArchNewVer.Nombre = objArch.Nombre.Substring(0, objArch.Nombre.LastIndexOf("V")) + " V" + objArchNewVer.Version.ToString();
                                    else
                                        objArchNewVer.Nombre = objArch.Nombre + " V" + objArchNewVer.Version.ToString();
                                    //objArchNewVer.Nombre = objArch.Nombre + " V" + objArch.Version.ToString();
                                    objArchNewVer.Descripcion = "";
                                    objArchNewVer.FechaCreacion = DateTime.Now;
                                    objArchNewVer.RequiereFirmar = Valores.Codigo_CHAR_Si;
                           
                                    objArchNewVer.PersonaId = objArch.PersonaId;
                                    objArchNewVer.GlobalRelacionId = objArch.GlobalRelacionId;
                                    objArchNewVer.CodigoFase = objArch.CodigoFase;
                                    objArchNewVer.ExpedienteId = objArch.ExpedienteId;
                                    objArchNewVer.Ruta = sNewFilename;

                                    objArchNewVer.Firmado = Valores.Codigo_CHAR_Si;
                                    objArchNewVer.FechaFirmado = DateTime.Now;
                                    objArchNewVer.Save();
                                    //Debe asociar el nuevo informe con la revision_fase
                                    UpdateInformeRevisionFase(objArch.Id, "ASOINF", objArchNewVer.Id.ToString());
                                    //Actualiza informe para notificación
                                   UpdateEstadoInfome(objArchNewVer.Id, Valores.Codigo_Estado_Inf_Aprobado, Valores.Codigo_CHAR_Si);

                                    CallRefreshGridParent();
                           
                                    if (ifRename)
                                    {
                                        File.Delete(sOutputFilename);
                                        winFirma.Close();
                                        X.Js.Call("wucFirma.ReloadTabDinamig", sNewFilename);
                                    }
                                    else
                                    {
                                        winFirma.Close();
                                        X.Msg.Show(new MessageBoxConfig
                                        {
                                            Buttons = MessageBox.Button.OK,
                                            Icon = MessageBox.Icon.INFO,
                                            Title = "Mensaje",
                                            Message = string.Format("{0}<br/>{1}", "Archivo Firmado", "Imagen primera pagina")
                                        });
                                    }
                                }
                                else
                                {
                                    this.txtClave.Text = "";
                                    X.Msg.Show(new MessageBoxConfig
                                    {
                                        Buttons = MessageBox.Button.OK,
                                        Icon = MessageBox.Icon.ERROR,
                                        Title = "Error",
                                        Message = string.Format("{0}<br/>{1}\n ", "Clave de certificado no válido", "Si dese firmar posteriormente documento seleciones opción <i>Firma electrónica</i> o ingrese clave correcta")
                                    });
                                }

                            }

                        }
                        else
                        {
                            winFirma.Close();
                            X.Msg.Show(new MessageBoxConfig
                            {
                                Buttons = MessageBox.Button.OK,
                                Icon = MessageBox.Icon.ERROR,
                                Title = "Error",
                                Message = string.Format("{0}<br/>{1}\n {2}", "Archivo Firmado", "Certicado Invalido", infoString)
                            });
                        }
                }
            }
            catch (Exception ex)
            {
                X.Msg.Show(new MessageBoxConfig
                {
                    Buttons = MessageBox.Button.OK,
                    Icon = MessageBox.Icon.ERROR,
                    Title = "Error",
                    Message = string.Format("{0}<br/>{1}\n {2}", "Error", "Error:", ex)
                });
                RegistrarLog(ex);
            }


        }
    
    }
}